// // Promise.all 实现
// // 输入不仅仅只有Array
// function promiseAll(args) {
//   return new Promise((resolve, reject) => {
//     const promiseResults = [];
//     let iteratorIndex = 0;
//     // 已完成的数量，用于最终的返回，不能直接用完成数量作为iteratorIndex
//     // 输出顺序和完成顺序是两码事
//     let fullCount = 0;
//     // 用于迭代iterator数据
//     for (const item of args) {
//       // for of 遍历顺序，用于返回正确顺序的结果
//       iteratorIndex += 1;
//       // 这里then是微任务，所以会先把for循环完毕 此时的iteratorIndex = 元素个数
//       // 之后同步任务结束执行是then方法
//       // 包一层，以兼容非promise的情况
//       Promise.resolve(item).then(res => {
//         promiseResults.push(res);
//         fullCount += 1;
//         // Iterator 接口的数据无法单纯的用length和size判断长度，不能局限于Array和 Map类型中、
//         // 相等说明then执行完了
//         if (fullCount === iteratorIndex) {
//           // resolve整个数组
//           resolve(promiseResults);
//         }
//       }).catch(err => {
//         reject(err);
//       })
//     }
//     // 处理空 iterator 的情况
//     if (iteratorIndex === 0) {
//       resolve(promiseResults);
//     }
//   })
// }


// Promise.myall = function(args) {
//   return new Promise((resolve, reject) => {
//     let index = 0;
//     let count = 0;
//     const res = [];
//     for (const item of args) {
//       index ++;
//       Promise.resolve(item).then(item => {
//         res.push(item);
//         count++;
//         if (count === index) {
//           resolve(res);
//         }
//       }).catch(err => {
//         reject(err);
//       })
//     }
//     if (index === 0) {
//       resolve([]);
//     }
//   })
// }

// 改进
Promise.myall = function(promises) {
  return new Promise((resolve, reject) => {
    const res = [];
    let count=0
    for (let i = 0; i < promises.length; i++) {
      Promise.resolve(promises[i]).then(item => {
        res[i] = item;
        count++;
        if (promises.length === count) {
          resolve(res);
        }
      }).catch(err => {
        reject(err);
      })
    }
    if (promises.length === 0) {
      resolve([]);
    }
  })
}


var p1 = new Promise((resolve, reject) => {
  resolve('22')
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'two');
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, 'three');
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, 'four');
});
var p5 = new Promise((resolve, reject) => {
  reject('reject');
});


Promise.myall([p1, p2, p3, p4, p5]).then(values => {
  console.log(values);
}, reason => {
  console.log(reason)
});



// let p1 = new Promise((resolve, reject) => {
//   reject('ok1');
// })

// let p2 = new Promise((resolve, reject) => {
//   reject('ok2');
// })

// let p1 = Promise.resolve('ok1');
// let p2 = Promise.resolve('ok2');
// // 多个reject也会执行，输出第一个reject值 ，而且会先执行1的then
// Promise.myall([p1, 1,p2,]).then(data => {
//   console.log('resolve', data);
// }, err => {
//   console.log('reject', err);
// })

// let p1 = new Promise((resolve, reject) => {
//   resolve('ok1');
// })

// let p2 = new Promise((resolve, reject) => {
//   reject('ok2');
// })

// Promise.myall([p1, p2, 1, 2, 3]).then(data => {
//   console.log('resolve', data);
// }, err => {
//   console.log('reject', err);
// })

// Promise.all([p1, p2, 1, 2, 3]).then(data => {
//   console.log('resolve', data);
// }, err => {
//   console.log('reject', err);
// })

//  test
// let p1 = Promise.resolve(3);
// let p2 = new Promise((resolve, reject) => {
//   setTimeout(resolve, 1000, 'lee')
//   // setTimeout的第三个往后参数都是用来作为第一个参数也就是函数的参数,也就是其实是setTimeout(resolve('lee'), 100)
// });
// let p3 = 4;
// // p3等待状态，1s之后resolve 才执行then resolve会保留状态。
// // 定时器是宏任务，会在没有微任务之后执行，所以在p1,p3resolve之后会有then的微任务，而p2没有
// // 所以会先push p1和p3,此时微任务没有了 就执行定时器，此时resolve 执行then ‘lee’，，之后都resolve
// // 才会去执行all的then
// Promise.myall([p1, p2, p3]).then(data => {
//   console.log(data);
// }, err => {
//   console.log('reject', err);
// })

// promiseAll([p1, p2, p3]).then(data => {
//   console.log(data);
// })
